package main

import (
	"fmt"
	"math/rand"
)

// golang 流程控制
func main() {

	//顺序控制

	//分支控制

	var age int

	fmt.Println("请输入你的年龄")
	//fmt.Scanln(&age)

	if age < 3 {
		fmt.Println("婴儿")
	} else if age < 18 {
		fmt.Println("青少年")
	} else if age < 28 {
		fmt.Println("青年")
	} else if age < 50 {
		fmt.Println("中年")
	} else {
		fmt.Println("老年")
	}

	//go 支持在if中 定义变量 大括号不可以省略
	if a := 20; a > 18 {
		fmt.Println("年龄大于十八岁,对自己的行为负责", a)
	}

	var x int = 2

	if x > 1 {
		fmt.Println()
	} else {
		fmt.Println()
	}

	var sal float32 = 12000.0

	if age < 30 && sal > 10000 {
		fmt.Println("结婚")
	}

	//switch 分支结构
	//没有break
	// switch case 后面可以调用函数
	// switch 后面可以定义变量

	fmt.Println("请输入你的数字 范围1-7")

	var week byte
	//fmt.Scanln(&week)

	switch test(week) + 1 {
	case 1:
		fmt.Println("星期一")
	case 2:
		fmt.Println("星期二")
	case 3:
		fmt.Println("星期三")
	case 4:
		fmt.Println("星期四")
	case 5:
		fmt.Println("星期五")
	case 6:
		fmt.Println("星期五")
	case 7:
		fmt.Println("星期六")
	case test(week):
		fmt.Println("week", week)
	default:
		fmt.Println("请输入数字范围是1-7")
	}

	//优秀
	switch {
	case age < 3:
		fmt.Println("婴儿")
	case age < 18:
		fmt.Println("青少年")
	case age < 28:
		fmt.Println("青年")
	case age < 50 && age != -1:
		fmt.Println("中年")
	default:
		fmt.Println("老年")
	}

	//switch 定义变量
	switch ages := 12; {
	case ages < 3:
		fmt.Println("婴儿")
	case ages < 18:
		fmt.Println("青少年")
	case ages < 28:
		fmt.Println("青年")
	case ages < 50 && ages != -1:
		fmt.Println("中年")
	default:
		fmt.Println("老年")
	}

	//  switch 穿透 fallthrough
	var num int = 30
	switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough
	case 20:
		fmt.Println("ok2")
	case 30, 40:
		fmt.Println("ok3,ok4")
	default:
		fmt.Println("default")
	}
	//循环控制
	//第一种写法
	for i := 1; i <= 10; i++ {
		fmt.Println("i like kai", i)
	}

	//第二种写法

	j := 1
	for j <= 10 {
		fmt.Println("j=", j)
		j++
	}

	var ii int = 12
	for {
		if ii < 1212 {
			fmt.Println("ii", ii)
			ii++
		} else {
			break
		}
	}

	//默认按照字节遍历

	var str string = "hello world"
	for i := 0; i < len(str); i++ {
		fmt.Printf("value %c index %v\n", str[i], i)
	}

	//一个字符 三个字节下标有问题 还是三个字符
	var str2 string = "hello world中国"
	for index, val := range str2 {
		fmt.Printf("value %c index %d\n", val, index)
	}

	strnew := []rune(str2)
	for i := 0; i < len(strnew); i++ {
		fmt.Printf("value %c index %v\n", strnew[i], i)
	}

	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%v*%v=%v\t", j, i, j*i)
		}
		fmt.Println()
	}

	//while do while 实现
	var qq = 1
	for {
		if qq > 10 {
			break
		}
		fmt.Println("qq=", qq)
		qq++
	}

	//do while
	qq = 1
	for {
		fmt.Println("qq=", qq)
		qq++
		if qq > 10 {
			break
		}
	}
	fmt.Println()

	//break

	for {

		num1 := rand.Intn(101)
		if num1 == 99 {
			break
		}
		fmt.Println(num1)
	}

lable1:
	for i := 0; i < 4; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				break lable1
			}
			fmt.Println("j=", j)
		}
	}

	//goto

	gotoTest()
}

func gotoTest() {

	fmt.Println("ok1")
	goto lable1
	//跳过这个两段代码
	fmt.Println("ok2")
	fmt.Println("ok3")

lable1:
	fmt.Println("ok4")
	fmt.Println("ok5")
	fmt.Println("ok6")

}

func test(i byte) byte {
	fmt.Println("test...")
	return i
}
